<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
</body>

</html>'
<script>
    //1.1 输出结果,并写出为什么 ？
    // for (var i = 0; i <= 5; i++) {
    //     setTimeout(() => {
    //         console.log(i);
    //     }, i * 1000)
    // }
    // console.log(i); //先打印一个6，然后间隔1秒打印出6个6
    //1.2 以上代码如果想输出6,0,1,2,3,4,5,怎么实现?
    // for (var i = 0; i <= 5; i++) {
    //     (function(i) {
    //         setTimeout(() => {
    //             console.log(i);
    //         }, i * 1000)
    //     })(i)
    // }
    // console.log(i);
    // 因为for循环是同步 定时器是异步函数通过自执行函数可实现(function(i) {})(接受外部参数)
    //1.3 通过let也可实现,let是块级作用域
    // for (let i = 0; i <= 5; i++) {
    //     console.log(i);
    //  }
    // console.log(i); 在这里console.log的i是找不到的因为let 是局部只在当前有效
    //2.输出结果,并写出为什么
    // var obj1 = {
    //         a: 1,
    //         b: 2,
    //         c: 3,
    //         d: {
    //             e: 4
    //         }
    //     }
    //     //var obj2=obj1  //浅拷贝  2,2,3,5 假设 A 赋值给 B 时 修改 A 的值以后 看B 是否发生变化这就是浅拷贝 
    // var obj2 = JSON.parse(JSON.stringify(obj1)) //深拷贝  1,2,3,4 如果B的值没有变化他就是深拷贝
    //     // var obj2 = {
    //     //         ...obj1
    //     //     } //1,2,3,5  展开符如果是1层是深拷贝,是多层浅拷贝
    // obj1.a = 2
    // obj1.d.e = 5
    // console.log(obj2);
    // 结果是 obj2 = {a:1,b:2,c:3,d:{e:5}}
    //  因为这是a:是深拷贝 而对于二级以上的数据类型直接赋值的话都是浅拷贝 浅拷贝是会随着拷贝后数据的变化而变化的 要是
    //  想要不变化的话 需要深拷贝  深拷贝的最简单的就是JSON.parse{JSON.stringify(obj)}  这是最简单的深拷贝  但是 遇到正则undfind null 等类型不可以深拷贝
    //  Object.assign()用于简单的浅拷贝 要是遇到引用数据类型 就拷贝不了 最好的深拷贝尽量还是使用递归函数  forin()循环进行深拷贝
    //3.event loop 事件循环题
    // setTimeout(() => {
    //     console.log(1);
    // }, 0)
    // new Promise((resolve, reject) => {
    //     console.log(2); //这里是同步
    //     resolve()
    // }).then(() => {
    //     console.log(4);
    // })
    // console.log('这里是同步');
    // 他的结果是 2,这里是同步,4,1
    // 任务的主线程按顺序执行 所以console.log(2) 会第一个出来 而console.log('这里是同步') 在外面的会跟在2的后面执行 当然为什么 console.log(4) 会出现
    // 在第二个任务 这个是要是因为 他是promise的回调 属于微任务 他就会在主线程的最后出现 而setTimeout是宏任务 他会等主线程全部执行完成后 在执行 所以先
    // log出4 而setTimeout最后执行console.log(1)
    // 微任务在上一个宏任务之后，下一个宏任务之前执行。
    // console.log(111); //1 同步
    // setTimeout(() => {
    //     console.log("setTimeout1"); //7
    // })
    // console.log(222); //2 同步
    // let p = new Promise((resolve, reject) => {
    //     resolve('aa')
    //     console.log(333); //3 
    // })
    // console.log(p); //4
    // p.then(res => {
    //     console.log(444, res); //6
    // }, err => {
    //     console.log(err);
    // })
    // setTimeout(() => {
    //     console.log("setTimeout2"); //8
    // })
    // console.log(555); //5
    //4.数组去重方法
    //    let arr = [12, 24, 37, 37, 24, 49, 49, 55, 55]  //去重
    // // 第一种方法  es6新办法 new Set()
    // let oneArr = Array.from(new Set(arr))
    // console.log(oneArr);
    // // 第二种办法   filter indexOf
    // let twoArr = arr.filter((item, i) => {
    //     return arr.indexOf(item) == i
    // });
    // console.log(twoArr);
    // // 第三种 forEach indexOf  注意forEach没有返回值
    // let sanArr = []
    // arr.forEach((item, i) => {
    //     if (arr.indexOf(item) == i) {
    //         sanArr.push(item)
    //     }
    // })
    // console.log(sanArr);
    //5.写出多种深拷贝方法
    // 示例
    let obj1 = {
        a: 1,
        b: {
            b1: 21
        }
    }
    let obj2 = {
            a: 2,
            b: {
                b2: 22
            }
        }
        //通过深拷贝,要求返回结果
        // let obj3 = {
        //         a: 2,
        //         b: {
        //             b1: 21,
        //             b2: 22
        //         }
        //     }
        // 第一
        /*    function deepMerge(obj1, obj2) {
                       for (let key in obj2) {
                         // 如果target(也就是obj1[key])存在，且是对象的话再去递归调用deepMerge，否则就是obj1[key]里面没这个对象，需要与obj2[key]合并
                         if( obj1[key] && obj1[key].toString() === "[object Object]" ){
                             obj1[key]=deepMerge(obj1[key], obj2[key]) //第2层对象，所以带obj1[key]
                         }
                         else{
                             obj1[key] = obj2[key]
                         }

                       }
                       return obj1;
                     }
                    let obj3=deepMerge(obj1,obj2)
                    console.log(obj3) */
        //6.统计字符串中出现最多的字母与次数
        /* var str = "abcdaaaaaaaa";
          //1.利用json键重复自动覆盖特点,去重
          var json={}
          for (var i = 0; i < str.length; i++) {
              var key=str[i]
              //判断json中值是否存在
              if(json[key]){
                  json[key]++
              }
              else{
                  json[key]=1;
              }

          }
          console.log(json)  //{a: 9, b: 1, c: 1, d: 1}

          //2.页面中输出,最多的字母与次数
          var max = 0;
          var key = ""
          for(var i in json){
              if(max < json[i]){
                  max = json[i]
                  key = i
              }

          }
          console.log(key,max) */
        //方法2-使用reduce()方法统计数组中字符串出现次数
        //数组归并方法  reduce(function(prev,cur,index,array){},传递给函数的初始值[可选])
        /*  let names = ['a', 'b', 'a', 'c', 'a'];
            let json2=names.reduce((prev,next)=>{
                console.log(prev) //{},初始化prev为对象
                if(next in prev){
                    prev[next]++
                }
                else{
                    prev[next]=1
                }
                return prev
            },{})
            console.log(json2) //{a: 3, b: 1, c: 1} */
        //7. 编写通用方法,把URL参数解析为一个对象，如：var url = “http://witmax.cn/index.php?key0=0&key1=1&key2=2″;    返回数据{key0: "0", key1: "1", key2: "2"}
        /* function toJson(hash){
                 hash=hash.split('?');
                 var arr=hash[1].split('&');
                 var json={};
                 for(var i=0;i<arr.length;i++){
                     var arr2=arr[i].split('=');
                     var key=arr2[0];
                     var value=arr2[1];
                     json[key]=value;
                 }
                 return json;
             }
         var url = "http://witmax.cn/index.php?key0=0&key1=1&key2=2";
         console.log(toJson(url));  // {key0: "0", key1: "1", key2: "2"}*/
</script>